import json
import random
import traceback
import jsonpath
import pymysql
from common.decs import relations
import requests


class Inter:
    def __init__(self):
        self.session=requests.session()
        self.json_result={}
        self.text_result=''
        self.relations={}
    def seturl(self,url):
        '''设置请求url'''
        self.url=url
        return self.url
    def addheader(self,key,value):
        '''添加请求头'''
        self.session.headers[key]=value
        return self.session.headers
    def __get_data(self,params=''):
        '''格式转行成字典'''
        params_l=params.split("&")
        params_d={}
        for i in params_l:
            if i.__contains__("="):
                i_l=i.split('=')
                params_d[i_l[0]]=i_l[1]
            else:
                params_d[i]=''
        return params_d
    @relations#关联
    def get(self,name='',params=''):
        #如果是http开头，就直接调用
        if name.startswith('http'):
            name=name
        else:
            #如果不是，就拼接url
            name=self.url+name
        #如果params开头是"{",
        if  params.startswith('{'):
            params = json.loads(params)
        else:
            params = self.__get_data(params)
        try:
            #执行接口
            res=self.session.get(url=name,params=params)
            try:
                #响应信息转成文本
                self.text_result=res.text
                #响应信息转成json
                self.json_result=json.loads(self.text_result)
            except Exception as e:
                self.json_result['error']='json处理异常'
                print(self.json_result['error'],traceback.TracebackException)
        except Exception as e:
            print('接口请求失败，请重新编辑')
        return self.json_result
    @relations
    def post(self,name='',params=''):
        # 如果是http开头，就直接调用
        if name.startswith('http'):
            name = name
        else:
            # 如果不是，就拼接url
            name = self.url + name
        if params.startswith('{'):
            params_json = json.loads(params)
            params_data=None
        else:
            params_data = self.__get_data(params)
            params_json=None

        params = self.__get_data(params)
        try:
            # 执行接口
            res = self.session.post(url=name, data=params_data, json=params_json)
            try:
                # 响应信息转成文本
                self.text_result = res.text
                # 响应信息转成json
                self.json_result = json.loads(self.text_result)
            except Exception as e:
                self.json_result['error'] = 'json处理异常'
                print(self.json_result['error'], traceback.TracebackException)
        except Exception as e:
            print('接口请求失败，请重新编辑')
        return self.json_result

    def save_json(self,key='',json_code=''):
        '''
        从上一个接口获取信息，保存在关联里
        :param key: 在关联字典中以key形式存放
        :param json_code: jsonpath提起公式
        :return: 返回关联字典
        '''
        # jsonpath提取
        #如果传入*，则获取全部返回结果值
        if key == "*":
            json_value = self.json_result
            self.relations[json_code] = json_value
        else:
            try:
                #如果是"$"开头，就是按照原公式提取
                if json_code.startswith("$"):
                    value=jsonpath.jsonpath(self.json_result,json_code)
                else:
                    #如果不是，就按照万能公式提取
                    value=jsonpath.jsonpath(self.json_result,"$..{0}".format(json_code))
                #把提起出来的值，自定义键，存放在self.relations里
            except Exception as e:
                value='error'
            self.relations[key]=value
            return self.relations
    def set_dbinfo(self,mysqlinfo=''):
        '''
        设置链接的数据库的信息
        :param mysqlinfo: 数据库的信息，ip , 库名，用户名，密码等
        :return:
        '''
        self.mysqlinfo=mysqlinfo
        return self.mysqlinfo
    def __con_db(slef, mysql_name=""):
        '''
        数据库链接
        :param mysql_name:数据库信息
        :return:
        '''
        #转成列表
        l = mysql_name.split(',')
        # print(len(l),l)
        #链接数据库
        slef.db = pymysql.connect(host=l[0], user=l[1], password=l[2], port=int(l[3]), db=l[4], charset='utf8')
        #创建游标对象
        slef.cur = slef.db.cursor()
        return slef.cur
    def assert_eqaul(self,json_key='',sqlcode=''):
        '''
        使用sql查询与上一个响应结果进行断言
        :param json_key:jsonpath命令提取接口响应信息字段
        :param sqlcode:数据库查询语句
        :return:
        '''
        try:
        #从响应结果提取字段，用于校验对比
            if json_key.startswith("$"):
                aul_res=jsonpath.jsonpath(self.json_result,json_key)[0]
                print("jsonpath提取出来的值：",aul_res)
            else:
                aul_res = jsonpath.jsonpath(self.json_result, "$..{0}".format(json_key))[0]
                print("jsonpath提取出来的值：", aul_res)
        except Exception as e:
            aul_res="接口没有响应结果"
            print("jsonpath提取出来的值：", aul_res)
        #链接数据库，创建游标
        s=self.__con_db(self.mysqlinfo)
        #执行查询语句
        s.execute(sqlcode)
        #获取单条数据
        s = s.fetchall()
        #把数据转成列表
        s = list(s)
        sql_res = []
        for i in s:
            i = list(i)
            for k in i:
                sql_res.append(k)
        print('sql查出来的值：', sql_res)
        if aul_res in sql_res:
            print("pass")
        else:
            print(sql_res)
            print('error')
        return sql_res
    def close_db(self):
        self.db.close()


# if __name__ == '__main__':


    # str = "127.0.0.1,root,123456,3306,my_project,utf8"
    # str = "192.168.1.221,qa,@test190411^,3306,yishou,utf8"
    # sqlcode ="SELECT user_name from fmys_users WHERE user_id='5153750'"
    # s = Inter()
    # s.seturl('http://test15.yishou.com')
    # s.post('/api/users/login',"mobile=13412341234&password=d1c2dcfcbfd41ce1103a25475b64f7a5") #登录接口
    # s.set_dbinfo("192.168.1.221,qa,@test190411^,3306,yishou") #链接数据库
    # s.assert_eqaul('user_name', "SELECT user_name from fmys_users WHERE user_id='5153751'") #校验断言
    # s.close_db()








